//package com.cyj.springbootservice.interceptor;
//
//import org.apache.commons.io.IOUtils;
//
//import javax.servlet.ReadListener;
//import javax.servlet.ServletInputStream;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletRequestWrapper;
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//
///**
// * @description: 包装HttpServletRequest
// * @Author C_Y_J
// * @create 2021-03-22 09:19
// **/
//public class MyServletRequestWrapper extends HttpServletRequestWrapper {
//
//    private final byte[] body;
//
//    /**
//     * Construct a wrapper for the specified request.
//     *
//     * @param request The request to be wrapped
//     */
//    public MyServletRequestWrapper(HttpServletRequest request) throws IOException {
//        super(request);
//        body = IOUtils.toByteArray(super.getInputStream());
//    }
//
//    @Override
//    public BufferedReader getReader() throws IOException {
//        return new BufferedReader(new InputStreamReader(getInputStream()));
//    }
//
//    @Override
//    public ServletInputStream getInputStream() throws IOException {
//        return new RequestBodyCachingInputStream(body);
//    }
//
//    private class RequestBodyCachingInputStream extends ServletInputStream {
//        private byte[] body;
//        private int lastIndexRetrieved = -1;
//        private ReadListener listener;
//
//        public RequestBodyCachingInputStream(byte[] body) {
//            this.body = body;
//        }
//
//        @Override
//        public int read() throws IOException {
//            if (isFinished()) {
//                return -1;
//            }
//            int i = body[lastIndexRetrieved + 1];
//            lastIndexRetrieved++;
//            if (isFinished() && listener != null) {
//                try {
//                    listener.onAllDataRead();
//                } catch (IOException e) {
//                    listener.onError(e);
//                    throw e;
//                }
//            }
//            return i;
//        }
//
//        @Override
//        public boolean isFinished() {
//            return lastIndexRetrieved == body.length - 1;
//        }
//
//        @Override
//        public boolean isReady() {
//            // This implementation will never block
//            // We also never need to call the readListener from this method, as this method will never return false
//            return isFinished();
//        }
//
//        @Override
//        public void setReadListener(ReadListener listener) {
//            if (listener == null) {
//                throw new IllegalArgumentException("listener cann not be null");
//            }
//            if (this.listener != null) {
//                throw new IllegalArgumentException("listener has been set");
//            }
//            this.listener = listener;
//            if (!isFinished()) {
//                try {
//                    listener.onAllDataRead();
//                } catch (IOException e) {
//                    listener.onError(e);
//                }
//            } else {
//                try {
//                    listener.onAllDataRead();
//                } catch (IOException e) {
//                    listener.onError(e);
//                }
//            }
//        }
//
//        @Override
//        public int available() throws IOException {
//            return body.length - lastIndexRetrieved - 1;
//        }
//
//        @Override
//        public void close() throws IOException {
//            lastIndexRetrieved = body.length - 1;
//            body = null;
//        }
//    }
//}
